package Thread;

import java.util.Objects;

//线程安全中锁synchronized的使用；
public class Demo16 {
    private static int count=0;
    //案例：进行创建两个线程，针对同一个对象进行修改操作，在锁synchronized的使用下是否可以成功保证线程的安全；
    //线程不安全产生的原因：
    //1：根本原因：线程的执行是否被操作系统进行随机调度执行的；
    //2，直接原因：线程中被修改的变量操作不是原子性的；
    //3.多个线程，同时针对同一个变量进行修改操作；
    //4.内存可见性问题也会导致线程不安全问题的产生；
    //5.指令重排序的原因也会导致线程不安全问题的产生；
    public static void main(String[] args) throws InterruptedException {
        Object locker=new Object();//锁对象的创建；
        //1，进行线程t1的创建；
        Thread t1=new Thread(()->{
            for(int i=0;i<5000;i++){
                synchronized (locker){
                    count++;
                }
            }
        });
        //2,进行线程t2的创建；
        Thread t2=new Thread(()->{
            for(int i=0;i<5000;i++){
                synchronized (locker){
                    count++;
                }
            }
        });
        //进行启动线程t1和线程t2;
        t1.start();
        t2.start();
        //让主线程等待线程t1和线程t2执行完毕再执行主线程；
        t1.join();
        t2.join();
        //进行获取count变量的结果值；
        //期望结果：两个线程都对count变量进行5000次的加加操作，得到的结果应是：10000；
        System.out.println("count的值为："+count);
        //真实结果：与预期结果相同；所以通过synchronized锁的使用可以成功解决线程安全问题；
    }
}
